use std::{fs, io, path::Path};
#[cfg(unix)]
use std::os::unix::fs::symlink;

// 在未提供`symlink`的平台上，我们将返回一个错误
#[cfg(not(unix))]
#[allow(dead_code)]
fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> io::Result<()> {
    Err(io::Error::new(io::ErrorKind::Other, "symlink not supported"))
}

#[allow(dead_code)]
pub fn copy_to(src:&Path, src_type: &fs::FileType, dst:&Path) -> io::Result<()> {
    if src_type.is_file() {
        fs::copy(src, dst)?;
    } else if src_type.is_dir() {
        copy_dir_to(src, dst)?;
    } else if src_type.is_symlink() {
        let read_link = src.read_link()?;
        symlink(read_link, dst)?;
    } else {
        return Err(io::Error::new(io::ErrorKind::Other, format!("don't know how to copy： {}", src.display())));
    }

    Ok(())
}

#[allow(dead_code)]
fn copy_dir_to(src:&Path, dst:&Path) -> io::Result<()> {
    if !dst.exists() {
        fs::create_dir(dst)?;
    }

    for entry_res in src.read_dir()? {
        let entry = entry_res?;
        let src = entry.path();
        let dst = dst.join(entry.file_name());
        let src_type = entry.file_type()?;
        copy_to(&src, &src_type, &dst)?;
    }

    Ok(())
}

